<?php

namespace App\Http\Controllers;

use App\Models\accountCredits;
use App\Models\manageSenderIds;
use App\Models\MessageingReport;
use App\Models\quick_report;
use App\Models\User;
use App\Providers\SmsHistory;
use App\Utility\SmsLib;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Str;

class SmsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    /**
     * @OA\Post(
     * path="/api/sms/send",
     * operationId="sendsms",
     * tags={"Sms"},
     * summary="sendSms",
     * description="sendSms",
     *     @OA\RequestBody(
     *         @OA\JsonContent(),
     *         @OA\MediaType(
     *            mediaType="application/x-www-form-urlencoded",
     *            @OA\Schema(
     *               type="object",
     *               required={"to", "sms", "from","unicode"},
     *               @OA\Property(property="to", type="text"),
     *               @OA\Property(property="sms", type="text"),
     *               @OA\Property(property="from", type="text"),
     *               @OA\Property(property="unicode", type="text"),
     *               @OA\Property(property="notification", type="boolean" , description="eg. true or false"),
     *            ),
     *        ),
     *    ),
     *      @OA\Response(
     *          response=202,
     *          description="Request  FOr Payment",
     *          @OA\JsonContent()
     *       ),
     *      @OA\Response(response=400, description="Bad Request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={{ "apiAuth": {} }}
     * )
     */
    public function send(Request $request)
    {
        if (!$request->has('to')) {
            Log::debug("[SmsController], [sendsms], to Parameter Missing");
            return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
        } else if (strlen($request->to) < 9) {
            Log::debug("[SmsController], [sendsms], To [$request->to], Not a valid msisdn");
            return response()->json(['msg' => config('messages.WRONG_MSISDN')], 400);
        } else if (!$request->has('from') && strlen($request->from) < 1) {
            Log::debug("[SmsController], [sendsms], from Parameter Missing");
            return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
        } else if (!$request->has('sms') && strlen($request->sms) < 1) {
            Log::debug("[SmsController], [sendsms], sms Parameter Missing");
            return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
        }
        // else if (!$request->has('unicode')) {
        //     Log::debug("[SmsController], [sendsms], unicode Parameter Missing");
        //     return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
        // }
        try {
            // if ($request->unicode != 1) {
            //     $request->unicode = 0;
            // }
            $token = $request->bearerToken();

            if (!empty($token)) {
                $cachedtoken = Redis::get($token);
                if (isset($cachedtoken)) {
                    Log::debug("[SmsController], [sendSms], Token in cache");
                    $stringLength  = Str::length($request->sms);
                    $messagesCount = ceil($stringLength / 160);
                    Log::debug("[SmsController], [sendSms], Messages Count [$messagesCount] ");
                    $userId = Redis::get($token . '_userId');
                    Log::debug("[SmsController], [sendSms], REQ [$userId], To [$request->to], From [$request->from], Unicode [$request->unicode], SMS Text [$request->sms]");
                    $senderId = manageSenderIds::where('user_id', $userId)->where('sender_id', $request->from)->where('status', 2)->first();
                    if (null != $senderId) {
                        $account = accountCredits::where('user_id', $userId)->first();
                        Log::debug("[SmsController], [sendSms],Account Credits  SMS [$account->sms], Email [$account->email], Voice [$account->email],");
                        if ($account->sms >= $messagesCount) {
                            $dt                 = Carbon::now();
                            $randNum            = random_int(1000, 9999);
                            $msisdn             = '260' . substr($request->to, -9);
                            $user               = [];
                            $user['user_id']    = $userId;
                            $user['message_id'] = 0;
                            $user['sender_id']  = env('ORIGIN_ADDR');
                            $user['msisdn']     = $msisdn;
                            $user['content']    = $request->sms;
                            $user['unicode']    = $request->unicode;
                            $user['status']     = 1; //1 for send 2 for delivered
                            $lId                = event(new smsHistory($user));
                            $lastId             = $lId[0];
                            // Log::debug("[SmsController], LastId [$lastId]");
                            $sms = $account->sms - $messagesCount;

                            $msg  = $request->sms;
                            $from = $request->from;
                            // if ("API" == env("SMS_SEND_MODE")) {
                            $mssg = SmsLib::sendSMS($msisdn, $msg);
                            Log::debug("[SmsController], Api-Response [$mssg]");
                            $data      = json_decode($mssg);
                            $message   = $data->message;
                            $messageId = $data->response[1];
                            $status    = $data->response[2];
                            if ($status == "Success") {
                                quick_report::where('id', $lastId)->update(['message_id' => $messageId, 'status' => 2]);
                                $updatecredit = accountCredits::where('user_id', $user)->update(['sms' => $sms]);
                                return response()->json([
                                    'messageId' => $messageId,
                                    'msg'       => $message], 200);
                            } else {
                                quick_report::where('id', $lastId)->update(['status' => 3]);
                                return response()->json([
                                    'msg' => $message], 200);
                            }
                        } else {
                            Log::debug("[SmsController], [sendSms],No Credits");
                            return response()->json(['msg' => "You don't have SMS credits, kindly purchase SMS bundle to continue."], 400);
                        }
                    } else {
                        Log::debug("[SmsController], [sendSms],from Does not exist");
                        return response()->json(['msg' => "From Does not exist"], 400);
                    }

                } else {
                    $user = User::where('identity_token', $token)->first();
                    if (!empty($user)) {
                        $uid = $user->id;
                        Log::debug("[SmsController], [sendSms], REQ [$uid], To [$request->to], From [$request->from], Unicode [$request->unicode], SMS Text [$request->sms]");
                        if (null != $user) {
                            $senderId = manageSenderIds::where('user_id', $uid)->where('sender_id', $request->from)->where('status', 2)->first();
                            if (null != $senderId) {
                                $stringLength = Str::length($request->sms);
                                $messageCount = ceil($stringLength / 160);
                                Log::debug("[SmsController], [sendSms], Messages Count [$messageCount] ");
                                $account = accountCredits::where('user_id', $user->id)->first();
                                Log::debug("[SmsController], [sendSms],Account Credits  SMS [$account->sms], Email [$account->email], Voice [$account->email],");
                                if ($account->sms >= $messageCount) {
                                    Redis::set($token, $user->identity_token, 'EX', 1800);
                                    Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
                                    $dt                 = Carbon::now();
                                    $randNum            = random_int(1000, 9999);
                                    $message_id         = date('YmdHis', strtotime($dt)) . $randNum . $user->id . time();
                                    $msisdn             = '260' . substr($request->to, -9);
                                    $user               = [];
                                    $user['user_id']    = $uid;
                                    $user['message_id'] = $message_id;
                                    $user['sender_id']  = $request->from;
                                    $user['msisdn']     = $msisdn;
                                    $user['content']    = $request->sms;
                                    $user['unicode']    = $request->unicode;
                                    $user['status']     = 1; //1 for send 2 for delivered
                                    $lId                = event(new smsHistory($user));
                                    $lastId             = $lId[0];

                                    Log::debug("[SmsController], LastId [$lastId]");
                                    $sms    = $account->sms - $messageCount;
                                    $msisdn = $request->to;
                                    $msg    = $request->sms;
                                    // $from   = $request->from;
                                    $mssg = SmsLib::sendSMS($msisdn, $msg);
                                    Log::debug("[SmsController], Api-Response [$mssg]");
                                    $data      = json_decode($mssg);
                                    $message   = $data->message;
                                    $messageId = $data->response[1];
                                    $status    = $data->response[2];
                                    if ($status == "Success") {
                                        quick_report::where('id', $lastId)->update(['message_id' => $messageId, 'status' => 2]);
                                        $updatecredit = accountCredits::where('user_id', $user)->update(['sms' => $sms]);
                                        return response()->json([
                                            'messageId' => $messageId,
                                            'msg'       => $message], 200);
                                    } else {
                                        quick_report::where('id', $lastId)->update(['status' => 3]);
                                        return response()->json([
                                            'msg' => $message], 400);
                                    }

                                } else {
                                    Log::debug("[SmsController], [sendSms],No Credits.");
                                    return response()->json(['msg' => "You don't have SMS credits, kindly purchase SMS bundle to continue."], 400);
                                }
                            } else {
                                Log::debug("[SmsController], [sendSms], from Does not exist");
                                return response()->json(['msg' => "from Does not exist"], 400);
                            }
                        } else {
                            Log::debug("[SmsController], [sendSms],User not found");
                            return response()->json(['msg' => "Invalid credentials"], 400);
                        }
                    } else {
                        Log::debug("[SmsController], [sendSms],User not found");
                        return response()->json(['msg' => " user is not valid "], 400);
                    }
                }
            } else {
                Log::debug("[SmsController], [sendSms],Token not found");
                return response()->json(['msg' => "Token not found"], 400);
            }

        } catch (Exception $e) {
            Log::debug("[SmsController], [sendSms], Msisdn [$request->to], Exception [" . $e->getMessage() . "]");
            return response()->json(["msg" => "Failed to Request for Pyment"], 400);
        }

    }

/**
 * @OA\Get(
 * path="/api/sms/send/{to}/{from}/{unicode}/{sms}",
 * operationId="sendsmsget",
 * tags={"Sms"},
 * summary="sendsmsget",
 * description="sendsmsget",
 *     @OA\Parameter(
 *    in="path",
 *    name="to",
 *    required=true,
 *     ),
 *   @OA\Parameter(
 *    in="path",
 *    name="from",
 *    required=true,
 *     ),
 * @OA\Parameter(
 *    in="path",
 *    name="unicode",
 *    required=true,
 *     ),
 * @OA\Parameter(
 *    in="path",
 *    name="sms",
 *    required=true,
 *     ),
 *      @OA\Response(
 *          response=202,
 *          description="sendsmsget",
 *          @OA\JsonContent()
 *       ),
 *      @OA\Response(response=400, description="Bad Request"),
 *      @OA\Response(response=404, description="Resource Not Found"),
 *      security={{ "apiAuth": {} }}
 * )
 */

    public function sendsmsget(Request $request, $to, $from, $unicode, $sms)
    {

        if (!$to) {
            Log::debug("[SmsController], [sendsmsget], to Parameter Missing");
            return response()->json(['msg' => "to Parameter Missing"], 400);
        } else if (strlen($to) < 9) {
            Log::debug("[SmsController], [sendsms], To [$to], Not a valid msisdn");
            return response()->json(['msg' => config('messages.WRONG_MSISDN')], 400);
        } else if (!$sms) {
            Log::debug("[SmsController], [sendsmsget], sms Parameter Missing");
            return response()->json(['msg' => "sms Parameter Missing"], 400);
        } else if (!$from) {
            Log::debug("[SmsController], [sendsmsget], from Parameter Missing");
            return response()->json(['msg' => "from Parameter Missing"], 400);
        }
        //  else if (!$unicode) {
        //     Log::debug("[SmsController], [sendsmsget], unicode Parameter Missing");
        //     return response()->json(['msg' => "unicode Parameter Missing"], 400);
        // }
        try {
            // if ($unicode != 1) {
            //     $unicode = 0;
            // }
            $token = $request->bearerToken();

            $msisdn = '260' . substr($to, -9);
            if (!empty($token)) {
                $cachedtoken = Redis::get($token);
                if (isset($cachedtoken)) {
                    $userId = Redis::get($token . '_userId');
                    Log::debug("[SmsController], [sendSms],Token in cache");
                    $stringLength  = Str::length($sms);
                    $messagesCount = ceil($stringLength / 160);
                    Log::debug("[SmsController], [sendSms], Messages [$messagesCount]");
                    $senderId = manageSenderIds::where('userid', $userId)->where('senderid', $from)->where('status', 2)->first();
                    if (null != $senderId) {
                        $account = accountCredits::where('user_id', $userId)->first();
                        Log::debug("[SmsController], [sendSms],Account Credits  SMS [$account->sms], Email [$account->email], Voice [$account->email],");
                        if ($account->sms >= $messagesCount) {
                            $dt                 = Carbon::now();
                            $randNum            = random_int(10000, 99999);
                            $message_id         = $randNum . date('YmdHis', strtotime($dt));
                            $user               = [];
                            $user['user_id']    = $userId;
                            $user['message_id'] = 0;
                            $user['sender_id']  = $from;
                            $user['msisdn']     = $msisdn;
                            $user['content']    = $sms;
                            $user['unicode']    = $unicode;
                            $user['status']     = 1;
                            event(new smsHistory($user));
                            $sms          = $account->sms - $messagesCount;
                            $updatecredit = accountCredits::where('user_id', $user)->update(['sms' => $sms]);
                            $msisdn       = $to;
                            $msg          = $sms;
                            $from         = $from;
                            $mssg         = SmsLib::SendSMS($msisdn, $msg);

                            $data      = json_decode($mssg);
                            $message   = $data->message;
                            $messageId = $data->response[1];
                            $status    = $data->response[2];
                            if ($status == "Success") {
                                quick_report::where('id', $lastId)->update(['message_id' => $messageId, 'status' => 2]);
                                $updatecredit = accountCredits::where('user_id', $user)->update(['sms' => $sms]);
                                return response()->json([
                                    'messageId' => $messageId,
                                    'msg'       => $message], 200);
                            } else {
                                quick_report::where('id', $lastId)->update(['status' => 3]);
                                return response()->json([
                                    'msg' => $message], 400);
                            }
                        } else {
                            Log::debug("[SmsController], [sendSms],No credits");
                            return response()->json(['msg' => "You don't have SMS credits, kindly purchase SMS bundle to continue."], 400);
                        }
                    } else {
                        Log::debug("[SmsController], [sendSms],From Does not exist");
                        return response()->json(['msg' => "From Does not exist"], 400);
                    }

                } else {

                    $user = User::where('identity_token', $token)->first();

                    $uid = $user->id;

                    if (null != $user) {
                        $senderId = manageSenderIds::where('userid', $user->id)->where('senderid', $from)->where('status', 2)->first();
                        if (null != $senderId) {
                            $stringLength = Str::length($sms);
                            $messageCount = ceil($stringLength / 160);
                            $account      = accountCredits::where('user_id', $user->id)->first();
                            Log::debug("[SmsController], [sendSms],Account Credits  SMS [$account->sms]");
                            if ($account->sms >= $messageCount) {
                                Redis::set($token, $user->identity_token, 'EX', 1800);
                                Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
                                $dt         = Carbon::now();
                                $randNum    = random_int(10000, 99999);
                                $message_id = $randNum . date('YmdHis', strtotime($dt));
                                Log::debug("[SmsController], [sendSms], MessageId[ $message_id]");
                                $user               = [];
                                $user['user_id']    = $uid;
                                $user['message_id'] = $message_id;
                                $user['sender_id']  = $from;
                                $user['msisdn']     = $msisdn;
                                $user['content']    = $sms;
                                $user['unicode']    = $unicode;
                                $user['status']     = 1;
                                event(new smsHistory($user));
                                $sms = $account->sms - $messageCount;
                                //$msisdn       = $msisdn;
                                $msg       = $sms;
                                $from      = $from;
                                $mssg      = SmsLib::sendSMS($msisdn, $msg);
                                $data      = json_decode($mssg);
                                $message   = $data->message;
                                $messageId = $data->response[1];
                                $status    = $data->response[2];
                                if ($status == "Success") {
                                    quick_report::where('id', $lastId)->update(['message_id' => $messageId, 'status' => 2]);
                                    accountCredits::where('user_id', $user)->update(['sms' => $sms]);
                                    return response()->json([
                                        'messageId' => $messageId,
                                        'msg'       => $message], 200);
                                } else {
                                    quick_report::where('id', $lastId)->update(['status' => 3]);
                                    return response()->json([
                                        'msg' => $message], 400);
                                }
                            } else {
                                Log::debug("[SmsController], [sendSms],No Credits found");
                                return response()->json(['msg' => "You don't have SMS credits, kindly purchase SMS bundle to continue."], 400);
                            }
                        } else {
                            Log::debug("[SmsController], [sendSms],from Does not exist");
                            return response()->json(['msg' => "from Does not exist"], 400);
                        }
                    } else {
                        Log::debug("[SmsController], [sendSms],User not found");
                        return response()->json(['msg' => "Invalid credentials"], 400);
                    }
                }
            } else {
                Log::debug("[SmsController], [sendSms],Token not found");
                return response()->json(['msg' => "Token not found"], 400);
            }
        } catch (Exception $e) {
            Log::debug("[SmsController], [sendsmsget], Msisdn [$to], Exception [" . $e->getMessage() . "]");
            return response()->json(["msg" => "Failed to send sms"], 400);
        }
    }

    /**
     * @OA\Post(
     * path="/api/sms/checkbalance",
     * operationId="balancestaus",
     * tags={"Sms"},
     * summary="balancestaus",
     * description="balancestaus",
     *     @OA\RequestBody(
     *         @OA\JsonContent(),
     *         @OA\MediaType(
     *            mediaType="application/x-www-form-urlencoded",
     *            @OA\Schema(
     *               type="object",
     *               @OA\Property(property="notification", type="boolean" , description="eg. true or false"),
     *            ),
     *        ),
     *    ),
     *      @OA\Response(
     *          response=202,
     *          description="Request  FOr Payment",
     *          @OA\JsonContent()
     *       ),
     *      @OA\Response(response=400, description="Bad Request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={{ "apiAuth": {} }}
     * )
     */
    public function balancestatus(Request $request)
    {

        try {
            $token = $request->bearerToken();
            if (!empty($token)) {
                $cachedtoken = Redis::get($token);
                if (isset($cachedtoken)) {
                    Log::debug("[SmsController], [checkbalance],Token in cache");
                    $user       = Redis::get($token . '_userId');
                    $usercredit = accountCredits::where('user_id', $user)->first();
                    Log::debug("[SmsController], [checkbalance], SMS [$usercredit->sms], Email [$usercredit->email], Voice [$usercredit->email], userId [$usercredit->user_id]");
                    return response()->json([
                        'userId' => $usercredit->user_id,
                        'sms'    => $usercredit->sms,
                        'email'  => $usercredit->email,
                        'voice'  => $usercredit->voice,
                        'msg'    => "User Credits"], 200);
                } else {
                    $user = User::where('identity_token', $token)->first();
                    if (null != $user) {
                        Redis::set($token, $user->identity_token, 'EX', 1800);
                        Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
                        $user       = Redis::get($token . '_userId');
                        $usercredit = accountCredits::where('user_id', $user)->first();
                        Log::debug("[SmsController], [checkbalance], SMS [$usercredit->sms], Email [$usercredit->email], Voice [$usercredit->email], userId [$usercredit->user_id]");
                        return response()->json([
                            'userId' => $usercredit->user_id,
                            'sms'    => $usercredit->sms,
                            'email'  => $usercredit->email,
                            'voice'  => $usercredit->voice,
                            'msg'    => "User Credits"], 200);
                    } else {
                        Log::debug("[SmsController], [checkbalance],User not found");
                        return response()->json(['msg' => "Invalid credentials"], 400);
                    }
                }
            } else {
                Log::debug("[SmsController], [checkbalance],Token not found");
                return response()->json(['msg' => "Token not found"], 400);
            }

        } catch (Exception $e) {
            Log::debug("[SmsController], [checkbalance], Msisdn [$Msisdn], Exception [" . $e->getMessage() . "]");
            return response()->json(["msg" => "Failed to Request for Pyment"], 400);
        }

    }
/**
 * @OA\Get(
 * path="/api/sms/checkbalance",
 * operationId="balancestatusget",
 * tags={"Sms"},
 * summary="balancestatusget",
 * description="balancestatusget",
 *      @OA\Response(
 *          response=202,
 *          description="balancestatusget",
 *          @OA\JsonContent()
 *       ),
 *      @OA\Response(response=400, description="Bad Request"),
 *      @OA\Response(response=404, description="Resource Not Found"),
 *      security={{ "apiAuth": {} }}
 * )
 */
    public function balancestatusget(Request $request)
    {

        try {
            $token = $request->bearerToken();
            if (!empty($token)) {
                $cachedtoken = Redis::get($token);
                if (isset($cachedtoken)) {
                    $user = Redis::get($token . '_userId');
                    Log::debug("[SmsController], [checkbalance],Token in cache");
                    $usercredit = accountCredits::where('user_id', $user)->first();
                    Log::debug("[SmsController], [checkbalance], SMS [$usercredit->sms], Email [$usercredit->email], Voice [$usercredit->email], userId [$usercredit->user_id]");
                    return response()->json([
                        'sms'   => $usercredit->sms,
                        'email' => $usercredit->email,
                        'voice' => $usercredit->voice,
                        'msg'   => "User Credits"], 200);
                } else {
                    $user = User::where('identity_token', $token)->first();
                    if (null != $user) {
                        Redis::set($token, $user->identity_token, 'EX', 1800);
                        Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
                        $user       = Redis::get($token . '_userId');
                        $usercredit = accountCredits::where('user_id', $user)->first();
                        Log::debug("[SmsController], [checkbalance],SMS [$usercredit->sms], Email [$usercredit->email], Voice [$usercredit->email], userId [$usercredit->user_id]");
                        return response()->json([
                            'sms'   => $usercredit->sms,
                            'email' => $usercredit->email,
                            'voice' => $usercredit->voice,
                            'msg'   => "User Credits"], 200);
                    } else {
                        Log::debug("[SmsController], [checkbalance],User not found");
                        return response()->json(['msg' => "Invalid credentials"], 400);
                    }
                }
            } else {
                Log::debug("[SmsController], [checkbalance],Token not found");
                return response()->json(['msg' => "Token not found"], 400);
            }

        } catch (Exception $e) {
            Log::debug("[SmsController], [checkbalance], Msisdn [$Msisdn], Exception [" . $e->getMessage() . "]");
            return response()->json(["msg" => "Failed to Request for Pyment"], 400);
        }
    }

/**
 * @OA\Post(
 * path="/api/sms/getstatus",
 * operationId="deliverystatus",
 * tags={"Sms"},
 * summary="getstatus",
 * description="getstatus",
 *     @OA\RequestBody(
 *         @OA\JsonContent(),
 *         @OA\MediaType(
 *            mediaType="application/x-www-form-urlencoded",
 *            @OA\Schema(
 *               type="object",
 *               required={"messageId"},
 *               @OA\Property(property="messageId", type="text"),
 *               @OA\Property(property="notification", type="boolean" , description="eg. true or false"),
 *            ),
 *        ),
 *    ),
 *      @OA\Response(
 *          response=202,
 *          description="Request  FOr Payment",
 *          @OA\JsonContent()
 *       ),
 *      @OA\Response(response=400, description="Bad Request"),
 *      @OA\Response(response=404, description="Resource Not Found"),
 *      security={{ "apiAuth": {} }}
 * )
 */

    public function deliverystatus(Request $request)
    {
        if (!$request->has('messageId')) {
            Log::debug("[SmsController], [deliverystatus], messageId Parameter Missing");
            return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
        }
        try {
            $token = $request->bearerToken();
            if (!empty($token)) {
                $cachedtoken = Redis::get($token);
                if (isset($cachedtoken)) {

                    Log::debug("[SmsController], [checkbalance],Token in cache");
                    $user         = Redis::get($token . '_userId');
                    $userMessages = MessageingReport::where('user_id', $user)->where('message_id', $request->messageId)->first();
                    if (!empty($userMessages)) {
                        Log::debug("[SmsController], [deliverystatus], messageId [$request->messageId], messageStatus [$userMessages->status], cachedUserId[$user],");
                        if ($userMessages->status == 1) {
                            return response()->json([
                                'msg' => "Message Sent"], 200);
                        } elseif ($userMessages->status == 2) {
                            return response()->json([
                                'msg' => "Message delivered"], 200);
                        } elseif ($userMessages->status == 3) {
                            return response()->json([
                                'msg' => "Message Not Delivered"], 200);
                        } else {
                            return response()->json([
                                'msg' => "Message Failed To Send"], 200);
                        }

                    } else {
                        Log::debug("[SmsController], [deliverystatus], cache,   MessageId not correct");
                        return response()->json(['msg' => " MessageId not correct"], 400);
                    }
                } else {
                    $user = User::where('identity_token', $token)->first();
                    if (null != $user) {
                        Redis::set($token, $user->identity_token, 'EX', 1800);
                        Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
                        $cachedtoken  = Redis::get($token);
                        $user         = Redis::get($token . '_userId');
                        $userMessages = MessageingReport::where('user_id', $user)->where('message_id', $request->messageId)->first();
                        if (!empty($userMessages)) {
                            Log::debug("[SmsController], [deliverystatus], messageId [$request->messageId], messageStatus [$userMessages->status], cachedUserId[$user],");
                            if ($userMessages->status == 1) {
                                return response()->json([
                                    'msg' => "Message Sent"], 200);
                            } elseif ($userMessages->status == 2) {
                                return response()->json([
                                    'msg' => "Message delivered"], 200);
                            } elseif ($userMessages->status == 3) {
                                return response()->json([
                                    'msg' => "Message Not Delivered"], 200);
                            } else {
                                return response()->json([
                                    'msg' => "Message Failed To Send"], 200);
                            }
                        } else {
                            Log::debug("[SmsController], [deliverystatus], MessageId not Correct");
                            return response()->json(['msg' => "MessageId not Correct"], 400);
                        }
                    } else {
                        Log::debug("[SmsController], [deliverystatus], No user Found");
                        return response()->json(['msg' => " No user found"], 400);
                    }
                }
            } else {
                Log::debug("[SmsController], [deliverystatus],Token not Found");
                return response()->json(['msg' => "Token not Found"], 400);
            }

        } catch (Exception $e) {
            Log::debug("[SmsController], [deliverystatus], Msisdn [$msisdn], Exception [" . $e->getMessage() . "]");
            return response()->json(["msg" => "Failed to Request for Pyment"], 400);
        }

    }

/**
 * @OA\Get(
 * path="/api/sms/getstatus/{messageId}",
 * operationId="deliverystatusget",
 * tags={"Sms"},
 * summary="deliverystatusget",
 * description="deliverystatusget",
 *       @OA\Parameter(
 *    in="path",
 *    name="messageId",
 *    required=true,
 *     ),
 *      @OA\Response(
 *          response=202,
 *          description="deliverystatusget",
 *          @OA\JsonContent()
 *       ),
 *      @OA\Response(response=400, description="Bad Request"),
 *      @OA\Response(response=404, description="Resource Not Found"),
 *      security={{ "apiAuth": {} }}
 * )
 */
    public function deliverystatusget(Request $request, $messageId)
    {
        if (!$messageId) {
            Log::debug("[SmsController], [deliverystatusget], messageId Parameter Missing");
            return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
        }
        try {
            $token = $request->bearerToken();
            if (!empty($token)) {
                $cachedtoken = Redis::get($token);
                if (isset($cachedtoken)) {
                    Log::debug("[SmsController], [checkbalance],Token in cache");
                    $user         = Redis::get($token . '_userId');
                    $userMessages = MessageingReport::where('message_id', $request->messageId)->where('user_id', $user)->first();
                    if (!empty($userMessages)) {
                        Log::debug("[SmsController], [deliverystatusget], messageId [$request->messageId], messageStatus [$userMessages->status], cachedUserId[$user],");
                        if ($userMessages->status == 1) {
                            return response()->json([
                                'msg' => "Message Sent"], 200);
                        } elseif ($userMessages->status == 2) {
                            return response()->json([
                                'msg' => "Message delivered"], 200);
                        } elseif ($userMessages->status == 3) {
                            return response()->json([
                                'msg' => "Message Not Delivered"], 200);
                        } else {
                            return response()->json([
                                'msg' => "Message Failed To Send"], 200);
                        }
                    } else {
                        Log::debug("[SmsController], [deliverystatusget], MessageId not Correct");
                        return response()->json(['msg' => "MessageId not Correct"], 400);
                    }

                } else {
                    $user = User::where('identity_token', $token)->first();
                    if (null != $user) {
                        Redis::set($token, $user->identity_token, 'EX', 1800);
                        Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
                        $cachedtoken  = Redis::get($token);
                        $user         = Redis::get($token . '_userId');
                        $userMessages = MessageingReport::where('user_id', $user)->where('message_id', $request->messageId)->first();
                        if (!empty($userMessages)) {
                            Log::debug("[SmsController], [deliverystatusget], messageId [$request->messageId], messageStatus [$userMessages->status], UserId[$user],");
                            if ($userMessages->status == 1) {
                                return response()->json([
                                    'msg' => "Message Sent"], 200);
                            } elseif ($userMessages->status == 2) {
                                return response()->json([
                                    'msg' => "Message delivered"], 200);
                            } elseif ($userMessages->status == 3) {
                                return response()->json([
                                    'msg' => "Message Not Delivered"], 200);
                            } else {
                                return response()->json([
                                    'msg' => "Message Failed To Send"], 200);
                            }
                        } else {
                            Log::debug("[SmsController], [deliverystatusget], MessageId not Correct");
                            return response()->json(['msg' => "MessageId not Correct"], 400);
                        }
                    } else {
                        Log::debug("[SmsController], [deliverystatusget], No Credits found");
                        return response()->json(['msg' => " NO Credits"], 400);
                    }
                }
            } else {
                Log::debug("[SmsController], [deliverystatusget],Token not Found");
                return response()->json(['msg' => "Token not Found"], 400);
            }

        } catch (Exception $e) {
            Log::debug("[SmsController], [getpayrequest], Msisdn [$msisdn], Exception [" . $e->getMessage() . "]");
            return response()->json(["msg" => "Failed to Request for Pyment"], 400);
        }
    }

// /**
//  * @OA\Post(
//  * path="/api/sms/getsms",
//  * operationId="getsms",
//  * tags={"Sms"},
//  * summary="getsms",
//  * description="getsms",
//  *     @OA\RequestBody(
//  *         @OA\JsonContent(),
//  *         @OA\MediaType(
//  *            mediaType="application/x-www-form-urlencoded",
//  *            @OA\Schema(
//  *               type="object",
//  *               required={"clientId"},
//  *               @OA\Property(property="clientId", type="text"),
//  *               @OA\Property(property="notification", type="boolean" , description="eg. true or false"),
//  *            ),
//  *        ),
//  *    ),
//  *      @OA\Response(
//  *          response=202,
//  *          description="Request  FOr Payment",
//  *          @OA\JsonContent()
//  *       ),
//  *      @OA\Response(response=400, description="Bad Request"),
//  *      @OA\Response(response=404, description="Resource Not Found"),
//  *      security={{ "apiAuth": {} }}
//  * )
//  */

//     public function getsms(Request $request)
//     {

//         if (!$request->has('clientId')) {
//             Log::debug("[SmsController], [getsms], clientId Parameter Missing");
//             return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
//         }
//         try {
//             $token       = $request->bearerToken();
//             $cachedtoken = Redis::get($token);
//             if (isset($cachedtoken)) {

//                 if ($cachedtoken == $token) {
//                     $user = Redis::get($token . '_userId');

//                     $userMessages = MessageingReport::where('user_id', $user)->get();
//                     Log::debug("[SmsController], [getsms], formCache  messages[$userMessages] cachedTOken[$cachedtoken], cachedUserId[$user],User Credits");
//                     return response()->json([
//                         'Messages' => $userMessages,
//                         'msg'      => "User Credits"], 200);

//                 } else {
//                     Log::debug("[SmsController], [getsms], cache,   No Credits found");
//                     return response()->json(['msg' => " NO Credits"], 400);
//                 }
//             } else {
//                 $user = User::where('identity_token', $token)->first();
//                 if (null != $user) {

//                     Redis::set($token, $user->identity_token, 'EX', 1800);
//                     Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
//                     $cachedtoken = Redis::get($token);
//                     if ($cachedtoken == $token) {

//                         $user = Redis::get($token . '_userId');

//                         $usermessages = MessageingReport::where('user_id', $user)->get();
//                         Log::debug("[SmsController], [getsms], Message[$usermessages] AddedcachedTken[$cachedtoken], AddedcachedUserId[$user],User Credits");
//                         return response()->json([
//                             'userCredits' => $usermessages,
//                             'msg'         => "User Credits"], 200);

//                     } else {
//                         Log::debug("[SmsController], [getsms], No Credits found");
//                         return response()->json(['msg' => " NO Credits"], 400);
//                     }

//                 } else {
//                     Log::debug("[SmsController], [getsms], User not found");
//                     return response()->json(['msg' => "Invalid credentials"], 400);
//                 }
//             }

//         } catch (Exception $e) {
//             Log::debug("[SmsController], [getsms], clientId [$request->clientId], Exception [" . $e->getMessage() . "]");
//             return response()->json(["msg" => "Failed to Request for Pyment"], 400);
//         }
//     }

// /**
//  * @OA\Get(
//  * path="/api/sms/getsmsget/{clientId}",
//  * operationId="getsmsget",
//  * tags={"Sms"},
//  * summary="getsmsget",
//  * description="getsmsget",
//  *     @OA\Parameter(
//  *    in="path",
//  *    name="clientId",
//  *    required=true,
//  *     ),
//  *      @OA\Response(
//  *          response=202,
//  *          description="getsmsget",
//  *          @OA\JsonContent()
//  *       ),
//  *      @OA\Response(response=400, description="Bad Request"),
//  *      @OA\Response(response=404, description="Resource Not Found"),
//  *      security={{ "apiAuth": {} }}
//  * )
//  */
//     public function getsmsget(Request $request, $clientId)
//     {
//         if (!$clientId) {
//             Log::debug("[SmsController], [getsmsget], clientId Parameter Missing");
//             return response()->json(['msg' => config('messages.PARAM_MISSING')], 400);
//         }
//         try {
//             $token       = $request->bearerToken();
//             $cachedtoken = Redis::get($token);
//             if (isset($cachedtoken)) {

//                 if ($cachedtoken == $token) {
//                     $user = Redis::get($token . '_userId');

//                     $userMessages = MessageingReport::where('user_id', $user)->get();
//                     Log::debug("[SmsController], [getsmsget], formCache  messages[$userMessages] cachedTOken[$cachedtoken], cachedUserId[$user],User Credits");
//                     return response()->json([
//                         'Messages' => $userMessages,
//                         'msg'      => "User Credits"], 200);

//                 } else {
//                     Log::debug("[SmsController], [getsmsget], cache,   No Credits found");
//                     return response()->json(['msg' => " NO Credits"], 400);
//                 }
//             } else {
//                 $user = User::where('identity_token', $token)->first();
//                 if (null != $user) {

//                     Redis::set($token, $user->identity_token, 'EX', 1800);
//                     Redis::set($token . '_' . 'userId', $user->id, 'EX', 1800);
//                     $cachedtoken = Redis::get($token);
//                     if ($cachedtoken == $token) {

//                         $user = Redis::get($token . '_userId');

//                         $usermessages = MessageingReport::where('user_id', $user)->get();
//                         Log::debug("[SmsController], [getsmsget], Message[$usermessages] AddedcachedTken[$cachedtoken], AddedcachedUserId[$user],User Credits");
//                         return response()->json([
//                             'userCredits' => $usermessages,
//                             'msg'         => "User Credits"], 200);

//                     } else {
//                         Log::debug("[SmsController], [getsmsget], No Credits found");
//                         return response()->json(['msg' => " NO Credits"], 400);
//                     }

//                 } else {
//                     Log::debug("[SmsController], [getsmsget], User not found");
//                     return response()->json(['msg' => "Invalid credentials"], 400);
//                 }
//             }

//         } catch (Exception $e) {
//             Log::debug("[SmsController], [getsms], clientId [$request->clientId], Exception [" . $e->getMessage() . "]");
//             return response()->json(["msg" => "Failed to Request for Pyment"], 400);
//         }

//     }
}
